#include "arquivo.h"

Arquivo::Arquivo()
{
}

void *Arquivo::load(FileType type, char *filename)
{
    void *ret = NULL;
    file.open(filename);
    if (file.is_open()) {
        switch(type) {
        case OBJECT:
            ret = loadObject();
            break;
        case CAMERA:
            ret = loadCamera();
            break;
        case ILUMINATION:
            ret = loadIlumination();
            break;
        }
        file.close();
    }
    return ret;
}

Objeto *Arquivo::loadObject()
{
    int numPontos;
    int numTriangulos;
    Vertice *repositorioPontos;
    Triangulo *repositorioTriangulos;

    file >> numPontos >> numTriangulos;
    repositorioPontos = (Vertice *) new Vertice[numPontos];
    double x, y, z;
    for(int i = 0; i < numPontos; i++) {
        file >> x >> y >> z;
        repositorioPontos[i].setPonto((float)x, (float)y, (float)z);
    }
    repositorioTriangulos = (Triangulo *) new Triangulo[numTriangulos];
    int v1, v2, v3;
    for(int i = 0; i < numTriangulos; i++) {
        file >> v1 >> v2 >> v3;
        repositorioTriangulos[i].setTriangulo(v1-1, v2-1, v3-1);
    }

    return new Objeto(numPontos, numTriangulos, repositorioPontos, repositorioTriangulos);
}

Camera *Arquivo::loadCamera()
{
    Ponto v;
    Ponto n;
    Ponto c;
    float d;
    float hX;
    float hY;
    double x, y, z;

    file >> x >> y >> z;
    c = Ponto((float)x, (float)y, (float)z);
    file >> x >> y >> z;
    n = Ponto((float)x, (float)y, (float)z);
    file >> x >> y >> z;
    v = Ponto((float)x, (float)y, (float)z);
    file >> d >> hX >> hY;

    return new Camera(n, v, c, d, hX, hY);
}

Iluminacao *Arquivo::loadIlumination()
{
    float ka;  // reflexao ambiental
    float kd[3];  // parte difusa
    float ks;  // parte especular
    float k;  // constante de rugosidade
    Cor ca;  // cor ambiental
    Cor cl;  // cor da fonte de luz
    Camera* pl;  // ponto de luz
    float d = 20;  // distancia para o foco da fonte de luz ; TODO: ver se isso eh arbitrario ou se deve vir de arquivo
    float hX = 800; // tamanho X da janela do foco;  TODO: ver se iss eh arbitrario ou se deve vir de arquivo
    float hY = 600; // tamanho Y da janela do foco;  TODO: idem

    double x, y, z;
    file >> x >> y >> z;
    pl = new Camera(Ponto(-(float)x, -(float)y, -(float)z), Ponto(0, 1, 0), Ponto((float)x, (float)y, (float)z), d, hX, hY);
    file >> ka;
    int R, G, B;
    file >> R >> G >> B;
    ca = Cor(R, G, B);
    file >> kd[0] >> kd[1] >> kd[2];
    file >> ks;
    file >> R >> G >> B;
    cl = Cor(R, G, B);
    file >> k;

    return new Iluminacao(pl, ka, ca, kd, ks, cl, k);
}
